iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0

連線資料庫

Laravel 關於資料庫連線的設定寫在 config\database.php 中,來一條條看看設定了什麼。

// config\database.php
'default' => env('DB_CONNECTION', 'mysql'),

預設以哪個連線設定進行資料庫連線,對應 .env 檔裡的 DB_CONNECTION 參數,預設連線 mysql 資料庫。

像是執行指令開啟資料庫 CLI 畫面時

php artisan db

沒有指定的話就是開啟預設資料庫。

php artisan db mysql

像這樣是指定開啟 mysql 資料庫連線。

至於如何定義多個不同連線呢,就是寫在 connections 裡面的內容

// config\database.php
'connections' => [

    'sqlite' => [
       ...
    ],

    'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],

    'pgsql' => [
        ...
    ],

    'sqlsrv' => [
        ...
    ],
 

]

Laravel 預先建立好了多種不同資料庫連線設定的範本,可以看到許多值是從 env 檔讀取的,一般只要設定 env 就夠了不會用到這裡。

以 mysql 為例,在 .env 中找到以下參數

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test_sail
DB_USERNAME=sail
DB_PASSWORD=password

如果是用 sail 的話會已經填好連線到 Mysql 容器的設定,這樣之後會自動讀取這裡的參數來連線 mysql 資料庫。

Laravel 對資料庫連線是應用了 PDO (PHP Data Objects) 的功能,所以要確保 php 環境設定中有開啟對應資料庫的 PDO 套件功能。

確認 PDO 是否被啟用,首先找到 php 環境設定檔,執行指令

sail php --ini

會出現目前設定檔的存放位址,主要是 Loaded Configuration File 的部分

開啟位址上的 ini 檔案後試著搜尋 pdo_mysql

;php.ini

...

extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
;extension=pdo_pgsql
;extension=pdo_sqlite

...

可以看到一排被註解的 extesion 設定,可以將需要的套件解除註解,這樣之後執行 php 指令時就會載入該套件了。

如果是用 sail 的話 php.ini 會在容器當中

不過前提是該套件檔在套件資料夾中是存在的,要找套件資料夾,在 php.ini 中搜尋
"extension_dir = ",就可以找到目前設定的套件資料夾在哪裡。

接著到該資料夾裡應該要能看到 pdo 的套件。

除了 connections 內的資料庫外還有一個特別被定義的資料庫連線,redis

'redis' => [

    'client' => env('REDIS_CLIENT', 'phpredis'),

    'options' => [
        'cluster' => env('REDIS_CLUSTER', 'redis'),
        'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
    ],

    'default' => [
        'url' => env('REDIS_URL'),
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', '6379'),
        'database' => env('REDIS_DB', '0'),
    ],

    'cache' => [
        'url' => env('REDIS_URL'),
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'password' => env('REDIS_PASSWORD', null),
        'port' => env('REDIS_PORT', '6379'),
        'database' => env('REDIS_CACHE_DB', '1'),
    ],

],

Redis 是一個開源,基於記憶體的鍵值對資料庫,因為是基於記憶體的構造所以讀寫速度較硬碟式的資料庫快得多,實務上有用來做 Unique Job Queue 讓 Laravel 定時執行任務,但避免執行重複的(正在執行當中)的任務。

關於 Redis 設定比較多,夠寫另一篇了。


上一篇
Controller
下一篇
Migrations
系列文
Laravel 實務筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言